package com.ruoyi.service.quality;

import com.ruoyi.domain.quality.MesQualityInspection;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 质量检验记录Service接口
 * 
 * @author ruoyi
 */
public interface IMesQualityInspectionService
{
    /**
     * 查询质量检验记录
     * 
     * @param inspectionId 质量检验记录主键
     * @return 质量检验记录
     */
    public MesQualityInspection selectMesQualityInspectionByInspectionId(Long inspectionId);

    /**
     * 查询质量检验记录列表
     * 
     * @param mesQualityInspection 质量检验记录
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectMesQualityInspectionList(MesQualityInspection mesQualityInspection);

    /**
     * 校验工艺路线编码是否唯一
     *
     * @param inspectionCode 工艺路线编码
     * @return 结果
     */
    public String checkInspectionCodeUnique(String inspectionCode , Long inspectionId);

    /**
     * 根据工单ID查询检验记录列表
     * 
     * @param workOrderId 工单ID
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectInspectionsByWorkOrderId(Long workOrderId);

    /**
     * 根据工单编号查询检验记录列表
     * 
     * @param workOrderCode 工单编号
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectInspectionsByWorkOrderCode(String workOrderCode);

    /**
     * 根据检验类型查询检验记录列表
     * 
     * @param type 检验类型
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectInspectionsByType(String type);

    /**
     * 根据检验员查询检验记录列表
     * 
     * @param inspector 检验员
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectInspectionsByInspector(String inspector);

    /**
     * 根据状态查询检验记录列表
     * 
     * @param status 状态
     * @return 质量检验记录集合
     */
    public List<MesQualityInspection> selectInspectionsByStatus(String status);

    /**
     * 新增质量检验记录
     * 
     * @param mesQualityInspection 质量检验记录
     * @return 结果
     */
    public int insertMesQualityInspection(MesQualityInspection mesQualityInspection);

    /**
     * 修改质量检验记录
     * 
     * @param mesQualityInspection 质量检验记录
     * @return 结果
     */
    public int updateMesQualityInspection(MesQualityInspection mesQualityInspection);

    /**
     * 批量删除质量检验记录
     * 
     * @param inspectionIds 需要删除的质量检验记录主键集合
     * @return 结果
     */
    public int deleteMesQualityInspectionByInspectionIds(Long[] inspectionIds);

    /**
     * 删除质量检验记录信息
     * 
     * @param inspectionId 质量检验记录主键
     * @return 结果
     */
    public int deleteMesQualityInspectionByInspectionId(Long inspectionId);
    
    // ==================== 采购入库质检(IQC)方法 ====================
    
    /**
     * 创建采购入库质检记录
     * 
     * @param receiptId 入库单ID
     * @param standardId 质检标准ID
     * @return 质检记录
     */
    public MesQualityInspection createIQCInspection(Long receiptId, Long standardId);
    
    /**
     * 处理采购入库质检结果
     * 
     * @param inspectionId 质检记录ID
     * @param conclusion 检验结论(PASS/FAIL)
     * @param remark 备注
     * @return 结果
     */
    public int processIQCResult(Long inspectionId, String conclusion, String remark);
    
    /**
     * 根据入库单ID查询质检记录
     * 
     * @param receiptId 入库单ID
     * @return 质检记录
     */
    public MesQualityInspection selectInspectionByReceiptId(Long receiptId);
    
    // ==================== 制造过程质检(IPQC)方法 ====================
    
    /**
     * 创建制造过程质检记录
     * 
     * @param workOrderId 工单ID
     * @param processId 工序ID
     * @param inspectionType 检验类型(FIRST_PIECE/PATROL/LAST_PIECE)
     * @param standardId 质检标准ID
     * @return 质检记录
     */
    public MesQualityInspection createIPQCInspection(Long workOrderId, Long processId, String inspectionType, Long standardId);
    
    /**
     * 处理制造过程质检结果
     * 
     * @param inspectionId 质检记录ID
     * @param conclusion 检验结论(PASS/FAIL)
     * @param remark 备注
     * @return 结果
     */
    public int processIPQCResult(Long inspectionId, String conclusion, String remark);
    
    /**
     * 根据工单和工序查询质检记录列表
     * 
     * @param workOrderId 工单ID
     * @param processId 工序ID
     * @return 质检记录集合
     */
    public List<MesQualityInspection> selectInspectionsByWorkOrderAndProcess(Long workOrderId, Long processId);
    
    /**
     * 检查工序是否可以开始生产(质检通过)
     * 
     * @param workOrderId 工单ID
     * @param processId 工序ID
     * @return 是否可以开始
     */
    public boolean canStartProcess(Long workOrderId, Long processId);
    
    // ==================== 制造成品质检(FQC)方法 ====================
    
    /**
     * 创建制造成品质检记录
     * 
     * @param workOrderId 工单ID
     * @param productId 产品ID
     * @param standardId 质检标准ID
     * @return 质检记录
     */
    public MesQualityInspection createFQCInspection(Long workOrderId, Long productId, Long standardId);
    
    /**
     * 处理制造成品质检结果
     * 
     * @param inspectionId 质检记录ID
     * @param conclusion 检验结论(PASS/FAIL)
     * @param remark 备注
     * @return 结果
     */
    public int processFQCResult(Long inspectionId, String conclusion, String remark);
    
    /**
     * 根据工单ID查询成品质检记录
     * 
     * @param workOrderId 工单ID
     * @return 质检记录
     */
    public MesQualityInspection selectFQCInspectionByWorkOrderId(Long workOrderId);
    
    /**
     * 检查工单是否可以完工(成品质检通过)
     * 
     * @param workOrderId 工单ID
     * @return 是否可以完工
     */
    public boolean canCompleteWorkOrder(Long workOrderId);
    
    // ==================== 通用质检方法 ====================
    
    /**
     * 自动生成检验单号
     * 
     * @param inspectionType 检验类型(IQC/IPQC/FQC)
     * @return 检验单号
     */
    public String generateInspectionCode(String inspectionType);
    
    /**
     * 质检状态流转
     * 
     * @param inspectionId 质检记录ID
     * @param targetStatus 目标状态
     * @return 结果
     */
    public int updateInspectionStatus(Long inspectionId, String targetStatus);
    
    /**
     * 获取质检统计数据
     * 
     * @param inspectionType 检验类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计数据
     */
    public Map<String, Object> getInspectionStatistics(String inspectionType, Date startDate, Date endDate);
}